﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;

//class为定义类的关键字，Stack为类的名字，{}中为类的主体，class相当于是结构体
//class stack
//{
//public:
//	//成员函数
//	void init(int n = 4)
//	{
//		/*public(公有)修饰的成员在类外可以直接被访问；protected和private(私有)修饰的成员在类外不能直接被访问，
//		访问权限作⽤域从该访问限定符出现的位置开始直到下⼀个访问限定符出现时为⽌，如果后⾯没有访问限定符，作⽤域就到}即类结束。
//		class定义成员没有被访问限定符修饰时默认为private，struct默认为public。
//	    ⼀般成员变量都会被限制为private / protected，需要给别⼈使⽤的成员函数会放为public。*/
//		array = (int*)malloc(sizeof(int) * n);
//		if (nullptr == array)
//		{
//			perror("malloc申请空间失败");
//			return;
//		}
//		capacity = n;
//		top = 0;
//	}
//	void Push(int x)
//	{
//		// ...扩容
//		array[top++] = x;
//	}
//	int top1()
//	{
//		return array[top - 1];
//	}
//private:
//	//成员变量
//	int* array;
//	size_t top;
//	size_t capacity;
//};
//int main()
//{
//	stack st1;
//	st1.init();
//	st1.Push(1);
//	cout << st1.top1() << endl;
//	return 0;
//}
//
//
//class date
//{
//public:
//	void init(int year, int month, int day)//一般情况下函数在上,成员变量在下;
//	{
//		_year = year;
//		_month = month;
//		_day = day;
//	}
//private:
//	// 为了区分成员变量，⼀般习惯上成员变量会加⼀个特殊标识，如_ 或者 m开头
//	int _year;
//	int _month;
//	int _day;
//};
//int main()
//{
//	date d;
//	d.init(2024, 7, 10);
//	return 0;
//}
//
////类定义了⼀个新的作⽤域，类的所有成员都在类的作⽤域中，在类体外定义成员时，需要使⽤::作⽤域操作符指明成员属于哪个类域
////定义在类里⾯的成员函数默认为inline
//
////如果不想在类里面,如下:/ 声明和定义分离，需要指定类域
//class date
//{
//public:
//	void init(int year, int month, int day);//一般情况下函数在上,成员变量在下;
//private:
//	// 为了区分成员变量，⼀般习惯上成员变量会加⼀个特殊标识，如_ 或者 m开头
//	int _year;
//	int _month;//只是声明,没有开空间.
//	int _day;
//};
//void date :: init(int year, int month, int day)
//{
//		_year = year;
//		_month = month;
//		_day = day;
//}
//
//// 兼容C的struct用法
//typedef struct ListNodeC
//{
//	int val;
//	struct ListNodeC* next;
//}LTNodeC;
//
//// CPP
//struct ListNodeCPP//不需要typedef
//{
//	int val;
//	ListNodeCPP* next;
//};


//****************************************************************************
//实例化和this指针
using namespace std;

#include<iostream>
using namespace std;
class date
{
public:
	// void Init(Date* const this, int year, int month, int day)
	void Init(int year, int month, int day)//C++规定不能在实参和形参的位置显⽰的写this指针(编译时编译器会处理)，但是可以在函数体内显⽰使⽤this指针。
	{
		this->_year = year;
		this->_month = month;
		this->_day = day;
	}
	// void Print(Date* const this)
	void Print()
	{
		cout << this->_year << "/" << this->_month << "/" << _day << endl;
	}
private:
	// 这里只是声明，没有开空间
	int _year;
	int _month;
	int _day;
};
//编译器编译后，类的成员函数默认都会在形参第⼀个位置，增加⼀个当前类类型的指针，叫做this
//指针。⽐如Date类的Init的真实原型为， void Init(Date* const this, int year,
//int month, int day)
//• 类的成员函数中访问成员变量，本质都是通过this指针访问的，如Init函数中给_year赋值， this-
//>_year = year;


int main()
{
	date d1;//一个类可以实例化多个对象.
	date d2;//不同对象成员变量不一样,但成员函数是一样的.

	//// d1.Init(&d1, 2024, 3, 31);
	d1.Init(2024, 5, 20);
	d1.Print();

	d2.Init(2024, 7, 10);
	d2.Print();

	return 0;
}


